﻿using Abp.AutoMapper;
using Abp.Domain.Services;
using Abp.ObjectMapping;
using Abp.Runtime.Caching;
using Abp.UI;
using AVIS.OutBound.AWD.Cache;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AVIS.OutBound.AWD
{
    public class AWDManager : DomainService, IAWDManager
    {
        private readonly IAWDRepository _AWDRepository;
        private readonly ICacheManager _cacheManager;
        private readonly IObjectMapper _objectMapper;

        public AWDManager(IAWDRepository awdRepository,
            ICacheManager cacheManager,
            IObjectMapper objectMapper)
        {
            _AWDRepository = awdRepository;
            _cacheManager = cacheManager;
            _objectMapper = objectMapper;
        }

        /// <summary>
        /// 获取AWD的实体
        /// </summary>
        /// <param name="awdcode">AWD号</param>
        /// <returns></returns>
        public AWDNumber GetAWDNumberCache(string awdcode)
        {
            if (string.IsNullOrWhiteSpace(awdcode))
            {
                return null;
            }

            var cache = _cacheManager.GetAWDCache();

            // 获取指定大写AWD的缓存值
            var upAWDCode = awdcode.ToUpper();
            var awdCacheItem = cache.GetOrDefault(upAWDCode);
            if (awdCacheItem != null)
            {
                return _objectMapper.Map<AWDNumber>(awdCacheItem);
            }

            // 获取数据库的AWD信息
            var awdNumber = _AWDRepository.GetAWDNumber(upAWDCode);
            if (awdNumber != null)
            {
                awdCacheItem = _objectMapper.Map<AWDCacheItem>(awdNumber);

                // 更新缓存（Code 和 CNAWD 两个Key值）
                cache.Set(awdNumber.Code.ToUpper(), awdCacheItem);
                if (!string.IsNullOrWhiteSpace(awdNumber.CNAWD)
                    && awdNumber.Code.ToUpper() != awdNumber.CNAWD.ToUpper())
                {
                    cache.Set(awdNumber.CNAWD.ToUpper(), awdCacheItem);
                }
            }
            return awdNumber;
        }

        /// <summary>
        /// 获取真实的AWD号，一般国内的AWD号是以CN开头的
        /// </summary>
        /// <param name="awdcode">AWD号</param>
        /// <returns></returns>
        public string GetRealAWDCode(string awdcode)
        {
            var awdNumber = GetAWDNumberCache(awdcode);
            if (awdNumber != null)
            {
                return awdNumber.Code;
            }
            else
            {
                return awdcode;
            }
        }

        /// <summary>
        /// 获取国内的AWD号，用于显示在界面给客户看，而请求数据时还需要转换为真实的AWD号
        /// 如果没有国内的AWD号，则直接返回传入AWD号
        /// </summary>
        /// <param name="awdcode">AWD号</param>
        /// <returns></returns>
        public string GetCNAWDCode(string awdcode)
        {
            var awdNumber = GetAWDNumberCache(awdcode);
            if (awdNumber != null && !string.IsNullOrWhiteSpace(awdNumber.CNAWD))
            {
                return awdNumber.CNAWD;
            }
            else
            {
                return awdcode;
            }
        }
    }
}
